循环队列实现杨辉三角及数据结构

1 篇文章 0 订阅
1 篇文章 0 订阅

数据结构顺序,链式实现栈和队列的相关操作,并用循环队列实现杨辉三角。

1.采用链式存储实现栈的初始化、入栈、出栈操作。
链式栈中首先确定栈底指针,再入栈,并移动栈顶指针。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAX 100       //栈,循环队列的最大值;
#define OVERFLOW -1

using namespace std;

typedef int ElemType;
typedef int Status;
typedef struct Stack   //顺序栈;
{ 
    ElemType *base;
    ElemType *top;
}SqStack;
typedef struct LNode    //链式栈的结点; 
{
    ElemType data;
    struct LNode *next;
};
typedef struct LqStack  //链式栈;
{
    struct LNode *base;
    struct LNode *top;
};
typedef struct Queue    //链式队列;
{
   struct LNode *rear;
   struct LNode *front;
}SqQueue;
typedef struct        //顺序队列
{  
    ElemType *base;
    int front;
    int rear;
}SqQueueCir;
typedef struct{   //杨辉三角特殊循环队列;

    ElemType *base;
    int front;
    int rear;
    int temp;          //记录上一行的rear,以确定出队的结束;
}SqQueueCirl;
void CreateLq(LqStack &s)   //链式栈的构建;
{
  s.top = (LNode*)malloc(sizeof(LNode));
  s.top->next = NULL;
}
void LqPush(LqStack &s)      //链式栈的入栈;
{
    LNode *p;
    cin>>s.top->data;
    p = (LNode*)malloc(sizeof(LNode));
    p->next = s.top;  //....
    s.top = p;
}
ElemType LqGetTop(LqStack s)
//链式栈的出栈,返回一个ElemT类型;数,并释放此结点。
{
    LNode *p;
    ElemType e;
    p = s.top->next;
    e = p->data;
    s.top->next= p->next;
    free(p);
    return e;
}

2.采用顺序存储实现栈的初始化、入栈、出栈操作。
顺序栈类似于数组,栈底指针为0号元素,


void CreateSq(SqStack &s)        //顺序栈初始化;
{
    s.base = (ElemType * )malloc(MAX*sizeof(ElemType));
    if(!s.base)
     exit(OVERFLOW);
    s.top = s.base;
}
void Push(SqStack &s,ElemType e)   //顺序栈入栈;
{
    if((s.top-s.base)>MAX||(s.top-s.base)==MAX)
      exit(OVERFLOW);
     *(s.top) = e;
     s.top++;
}
ElemType GetTop(SqStack &s)       //顺序栈出栈;
{
    ElemType e;
    if(s.top == s.base)//判断栈空;
    cout<<"栈为空!"<<endl;
    e = *(s.top-1);
    s.top--;
    return e;
}

3.采用链式存储实现队列的初始化、入队、出队操作。

void InitQueue(SqQueue &Q)      //链式队列的初始化;
{
    Q.rear=(LNode*)malloc(sizeof(LNode));
    if(!Q.rear)exit(OVERFLOW);//判断是否成功开辟空间;
     Q.front = Q.rear;
    Q.front->next = NULL;
}
void EnQueue(SqQueue &Q)   //链式队列的入队;
{
    LNode *p;
    p = (LNode*)malloc(sizeof(LNode));
    if(!p)exit(OVERFLOW);
    cin>>p->data;
    p->next = NULL;
    Q.rear->next = p;
    Q.rear = p;
}
ElemType PoQueue(SqQueue &Q)//链式队列的出队;
{
    LNode *p;
    ElemType e;
    if(Q.rear ==Q.front)exit(OVERFLOW);
    p = Q.front->next;
    e = p->data;
    Q.front->next = p->next;
    if(Q.rear == p) Q.rear = Q.front;
    free(p);
    return e;
}

4.采用顺序存储实现循环队列的初始化、入队、出队操作。

void Create_Sq(SqQueueCir &q)
{
    q.base = (ElemType*)malloc(MAX * sizeof(ElemType));
    if(!q.base)exit(OVERFLOW);
    q.front = q.rear =0;
}
void InitQueue_Sq(SqQueueCir &q)//入队
{
    if((q.rear+1)%MAX==q.front)exit(OVERFLOW);
    cin>>q.base[q.rear];
    q.rear = (q.rear+1)%MAX;
}
ElemType DeQueue_Sq(SqQueueCir &q)
{
    if(q.front==q.rear)exit(OVERFLOW);
    ElemType e = q.base[q.front];
    q.front = (q.front+1)%MAX;
    return e;
}

5.在主函数中设计一个简单的菜单,分别测试上述算法。

void Menu()
{printf("按数字键选择相应操作\n");
 printf("<1> 采用链式存储实现栈的初始化、入栈、出栈操作:\n");
 printf("<2> 采用顺序存储实现栈的初始化、入栈、出栈操作:\n");
 printf("<3> 采用链式存储实现队列的初始化、入队、出队操作\n");
 printf("<4> 采用顺序存储实现循环队列的初始化、入队、出队操作:\n");
 printf("<5> 利用栈实现数制转换(将一个十进制数转换成d进制数):\n");
 printf("<6> 利用队列打印8行杨辉三角:编写程序,根据输入的行数,屏幕显示8行杨辉三角:\n");
 printf("<0> 退出:\n");
}

6. 利用栈实现数制转换(将一个十进制数转换成d进制数)

void conversion()
{
    SqStack s;
    CreateSq(s);
    cout<<"请输入需转换进制元素:";
    ElemType e,n;
    cin>>e;
    cout<<"请输入转换成多少进制的权:";
    cin>>n;
    while(e)
    {
      Push(s,e%n);
      e=e/n;
    }
    while(s.base != s.top)
    {
        cout<<GetTop(s);
    }
    cout<<"("<<n<<")";
    cout<<endl;
}

7. 利用循环队列打印杨辉三角:编写程序,根据输入的行数,屏幕显示杨辉三角。
由于使用循环队列,所以只打印前八行的杨辉三角。

void Create(SqQueueCirl &q)
{
    q.base = (ElemType*)malloc(10*sizeof(ElemType));
   if(!q.base)exit(OVERFLOW);
   q.base[0] = 0;
   q.base[1] = 1; //循环队列的第一个元素存为1;
   q.temp = q.rear = 2;//对头和输出指针指向第二个元素的位置;
   q.front = 1;
}
void Init(SqQueueCirl &q)
{
    if((q.rear+1)%10==q.front)
    {cout<<"队列满";
     exit(OVERFLOW);
    }
     q.base[q.rear] = q.base[(q.front+9)%10]+q.base[q.front];
     q.rear = (q.rear+1)%10;
}
ElemType DeQueue_Sq(SqQueueCirl &q)
{
    if(q.front==q.rear)exit(OVERFLOW);
    ElemType e = q.base[q.front];
    q.front = (q.front+1)%10;
    return e;
}
void PascalTriangle()
{
    SqQueueCirl q;
    Create(q);
    int i = 8,k=14;
    while(i--)
    {   while(k--)
        cout<<" ";
        while(q.front!=q.temp)
         {
              Init(q);
            cout<<DeQueue_Sq(q)<< "   ";
         }//输出上一行的i时,存入下一行的元素;
         q.base[(q.temp+9)%10] = 0;
         cout<<endl;
         q.base[q.rear] = 1;
         q.rear = (q.rear+1)%10;
         q.temp = q.rear;
        k = (i-1)*2;
    }
}

主函数

int main()
{
     int m,e,n;
     while(1)
    {
        Menu();
       cin >>n;
     switch(n)
     {
         case 1:
            cout<<"请输入需入栈元素个数:";
            LqStack head;
            CreateLq(head);
            cin>>m;
            cout<<"请依次输入"<<m<<"个数:"<<endl;
            while(m--)
                LqPush(head);
            cout<<"入栈完成!"<<endl;
            while(head.top->next!=NULL)
            {
                cout<<LqGetTop(head)<<"  ";
            }
            cout<<endl;
            cout<<"出栈完成!"<<endl;
            break;
         case 2:
            cout<<"请输入需入栈元素个数:";
            SqStack s;
            CreateSq(s);
            cin>>m;
            cout<<"请依次输入"<<m<<"个数:"<<endl;
            while(m--)
            {
                cin>>e;
                Push(s,e);
            }
            cout<<"入栈完成!"<<endl;
            while(s.base != s.top)
            {
                cout<<GetTop(s)<<"  ";
            }
            cout<<endl;
            cout<<"出栈完成!"<<endl;
            break;
        case 3:
            cout<<"请输入需入队元素个数:";
            SqQueue Q;
            InitQueue(Q);
            cin>>m;
            cout<<"请依次输入"<<m<<"个数:"<<endl;
            while(m--)
                 EnQueue(Q);
            cout<<"入队完成!"<<endl;
            while(Q.front!=Q.rear)
            {
                cout<<PoQueue(Q)<<"  ";
            }
            cout<<endl;
            cout<<"出队完成!"<<endl;
            break;
        case 4:
            cout<<"请输入需入队元素个数:";
            SqQueueCir h;
            Create_Sq(h);
            cin>>m;
            cout<<"请依次输入"<<m<<"个数:"<<endl;
            while(m--)
                 InitQueue_Sq(h);
            cout<<"入队完成!"<<endl;
            while(h.front!=h.rear)
            {
                cout<<DeQueue_Sq(h)<<"  ";
            }
            cout<<endl;
            cout<<"出队完成!"<<endl;
            break;

        case 5:
            conversion();
            break;

        case 6:
            PascalTriangle();
            break;

        case 0:
            exit(OVERFLOW);
        default:
            cout<<"输入错误,请重新输入:"<<endl;
            break;
        }
    }
    return 0;
}

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现循环队列生成杨辉三角的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义循环队列 typedef struct { int front; // 队首指针 int rear; // 队尾指针 int items[MAX_SIZE]; // 队列元素 } Queue; // 初始化队列 void init_queue(Queue *q) { q->front = q->rear = 0; } // 判断队列是否为空 int is_empty(Queue *q) { return q->front == q->rear; } // 判断队列是否已满 int is_full(Queue *q) { return (q->rear + 1) % MAX_SIZE == q->front; } // 元素入队 void enqueue(Queue *q, int item) { if (!is_full(q)) { q->items[q->rear] = item; q->rear = (q->rear + 1) % MAX_SIZE; } } // 元素出队 int dequeue(Queue *q) { if (!is_empty(q)) { int item = q->items[q->front]; q->front = (q->front + 1) % MAX_SIZE; return item; } return -1; } // 生成杨辉三角 void generate_yanghui_triangle(int n) { Queue q; init_queue(&q); enqueue(&q, 1); // 第一行只有一个数字1 for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) { printf("%d ", q.items[j]); } printf("\n"); for (int j = 0; j <= i; j++) { enqueue(&q, dequeue(&q) + q.items[j]); } enqueue(&q, 1); // 行末添加数字1 } } int main() { generate_yanghui_triangle(5); // 生成5行杨辉三角 return 0; } ``` 代码中定义了一个循环队列结构体Queue,包含front、rear和items三个成员变量。init_queue函数用于初始化队列,is_empty和is_full函数用于判断队列是否为空和已满,enqueue和dequeue函数实现元素的入队和出队操作。generate_yanghui_triangle函数使用队列来生成杨辉三角,通过两个for循环遍历队列中的数字并输出,将队首出队并加上队列中的每个数字,将结果入队,最后再将数字1入队。重复这个过程,就可以生成指定行数的杨辉三角

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值